﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.IO;


namespace KinectControl
{
    public class CapaAlbum
    {
        private static string path;
        //Cria miniatura da foto obdecendo a proporção para nao perder qualidade
        public void CriarCapa(Brush corFundo)
        {
            path = Config.PastaRaiz;

            Random _random = new Random();

            DirectoryInfo objDir = new DirectoryInfo(path);
            DirectoryInfo[] lstDirAlbum = objDir.GetDirectories();

            //Verifica se o capa.png está em uso.
            if (lstDirAlbum != null && lstDirAlbum.Count() > 0)
                if (CheckIfFileIsBeingUsed(path + string.Format(@"\{0}\capa.png", lstDirAlbum[0].Name)))
                    return;

            foreach (var album in lstDirAlbum)
            {
                FileInfo[] AllImages = Uteis.ListaFotosDoAlbum(path, album.Name);
                List<FileInfo> CoverImages = SelecionaImagensDaCapa(_random, AllImages);

                Canvas CanvasBox = new Canvas();
                ConfiguraCanvas(CanvasBox, corFundo);

                int count = 0;

                if (CoverImages.Count == 0)
                {
                    if (AllImages.Length > 0)
                        CoverImages.Add(AllImages[count]);
                    else
                        count = CoverImages.Count - 1;
                }
                else
                    count = CoverImages.Count;
                                

                //Cria bolinho de até 5 imagens para gerar a CAPA
                foreach (FileInfo f in CoverImages)
                {
                    Image ImageBox = new Image();

                    BitmapImage bmpImage = Uteis.CreateThumbNail(f.FullName, 170, 170);
                    ImageBox.Source = bmpImage;                    

                    //cria borda pra imagem
                    Border border = new Border();
                    border.BorderThickness = new Thickness(7);
                    border.BorderBrush = Brushes.White;
                    
                    //seta tamanho do componente image igual ao tamanho do thumbnail
                    ImageBox.MaxHeight = bmpImage.DecodePixelHeight;
                    ImageBox.MaxWidth = bmpImage.DecodePixelWidth;
                    border.MaxHeight = bmpImage.DecodePixelHeight;
                    border.MaxWidth = bmpImage.DecodePixelWidth;
                    
                    //define a borda para o componente image
                    border.Child = ImageBox;                    

                    //rotaciona a imagem
                    SelecionaAnguloRotacao(count, border, _random);
                                        
                    CanvasBox.Children.Add(border);

                    count--;
                }  
                
                //exporta pra um PNG o bolinho de imagens que será a capa de um album
                if (AllImages.Length > 0)
                    Uteis.ExportToPng(new Uri(path + string.Format(@"\{0}\capa.png", album.Name), UriKind.RelativeOrAbsolute), CanvasBox);
            }
        }



        //seta tamanho 220x220 para o canvas que vai guardar as imagens empilhadas
        private static void ConfiguraCanvas(Canvas canvasBox, Brush corFundo)
        {
            canvasBox.Height = 230;
            canvasBox.Width = 230;
            canvasBox.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
            canvasBox.Background = corFundo;
        }

        private static List<FileInfo> SelecionaImagensDaCapa(Random _random, FileInfo[] AllImages)
        {
            List<FileInfo> CoverImages = new List<FileInfo>();
            //seleciona até 5 imagens de cada album randomicamente para gerar a capa
            for (int i = 0; i < AllImages.Length - 1; i++)
            {
                CoverImages.Add(AllImages[_random.Next(0, AllImages.Length - 1)]);

                if (i > 3)
                    break;
            }
            CoverImages = CoverImages.DistinctBy(t => t.Name).ToList();
            return CoverImages;
        }

        

        private void SelecionaAnguloRotacao(int i, Border border, Random _random)
        {
            int angulo = 0;
            switch (i)
            {
                case 0:
                    angulo = _random.Next(-10, 10);
                    border.LayoutTransform = new RotateTransform(angulo);
                    break;
                case 1:
                    angulo = _random.Next(20, 90);
                    border.LayoutTransform = new RotateTransform(angulo);
                    break;
                case 2:
                    angulo = _random.Next(30, 180);
                    border.LayoutTransform = new RotateTransform(angulo);
                    break;
                case 3:
                    angulo = _random.Next(40, 180);
                    border.LayoutTransform = new RotateTransform(angulo);
                    break;
                case 4:
                    angulo = _random.Next(50, 180);
                    border.LayoutTransform = new RotateTransform(angulo);
                    break;
                default:
                    break;
            }
        }

        private static bool CheckIfFileIsBeingUsed(string fileName)
        {
            try
            {
                File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
            }
            catch (FileNotFoundException)
            {
                return false;
            }
            //Se a capa está sendo usada pelo processo do vitrine.
            catch (IOException)
            {
                return true;
            }

            return false;
        }
    }
}
